package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

/**
 * 在具体说明成员内部类当中定义成员的特点之前，我们先要明确以下两点：
 *   1.成员内部类可以看成该类的一个成员。
 *   所以，想要得到成员内部类对象，必须先创建外围类对象。
 *   在外围类对象的基础上,才能够创建成员内部类对象
 * 注：每一个成员内部类对象都会持有外围类对象的引用作为成员变量，这是编译器偷偷为我们加上去的。
 *
 * 2.创建对象会触发类加载，即便是内部类也不例外。
 * 由1我们可以推导出，类加载的顺序也应该是先类加载外围类，再类加载成员内部类。 * 所以，成员内部类没有静态声明。
 *
 * 成员内部类
 * 成员内部类是最普通的内部类，它定义在另一个类的成员位置， 可以看成该类的一个成员。
 * 成员内部类可以看成直接将一个类定义在外围类的类体中.
 *
 * 语法：
 * //外围类
 * [访问权限修饰符] class EnclosedClazz{
 * //成员内部类
 *   [访问权限修饰符] class InnerClazz{
 *  }
 * }
 *
 * 成员内部类的自身特点
 * 主要从以下几个角度分析：
 *      1.访问权限修饰符,四种皆可
 *          但是需要注意
 *          要想访问成员内部类当中的成员
 *          首先需要能够访问外围类
 *          其次要能够访问成员内部类
 *          最后还需要成员的访问权限
 *
 *     2.成员特点
 *          成员内部类当中没有静态声明,其余和普通类一模一样
 *          这意味着,成员内部类没有:
 *              1.静态成员变量
 *              2.静态成员方法
 *              3.静态代码块
 *
 *          静态static修饰的结构中 全局常量是一个非常特殊的存在
 *          字面值常量赋值的全局常量,不会触发该类的类加载
 *          所以字面值常量赋值的全局常量,允许出现在成员内部类当中.
 *
 *      3.继承和实现(仅做了解)
 *          成员内部类也是允许继承类或者实现接口的
 *          特殊的,当成员内部类继承和实现内部类/接口时
 *          也是可以的
 *
 * @since 15:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    class A {
    }

    interface IA {
    }

    // 成员内部类
    class InnerClazz extends A implements IA {
        int a;
        private int b = 10;
        // Inner classes cannot have static declarations
        // static int c = 20;
        // static void test(){}
        // static {}
        static final int C = 20;
        // static final Demo d = new Demo();
        static final String str = "abc";
        // static final String str2 = new String();


        public InnerClazz() {
        }


        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }

        {
        }

    }
}
